Implemente las estructuras de datos y algoritmos básicos para la solución de un problema mediante algoritmos genéticos. Pruebe estas rutinas para buscar el mínimo global de las siguientes funciones:
# Definición de funciones a minimizar
funcion01 <- function(x){
return(-x*sin(sqrt(abs(x))))
}
# Rango de la variable
xMin <- -512
xMax <- 512
resultado <- algoritmoGenetico(cantidadIndividuos = 5, limiteInf = xMin, limiteSup = xMax, generacionesSinCambio = 40, fitnessFn = function(x) {-funcion01(x)})
## mejor individuo proceso: 427.775835752487
x <- seq(-512, 512, length.out = 255)
y <- funcion01(x)
datos <- as.data.frame(cbind(x,y))
ggplot(data = datos, aes(x = x, y = y)) +
geom_line() +
labs(title = "funcion01") +
theme_bw() +
theme(legend.position = "none") +
geom_vline(xintercept = resultado$mejor_individuo, color="red")
funcion02 <- function(x){
return(x+sin(3*x)+8*cos(5*x))
}
xMin <- 0
xMax <- 20
resultado <- algoritmoGenetico(cantidadIndividuos = 5, limiteInf = xMin, limiteSup = xMax, generacionesSinCambio = 40, fitnessFn = function(x) {-funcion02(x)})
## mejor individuo proceso: 1.85299611650407
x <- seq(xMin, xMax, length.out = 255)
y <- funcion02(x)
datos <- as.data.frame(cbind(x,y))
ggplot(data = datos, aes(x = x, y = y)) +
geom_line() +
labs(title = "funcion02") +
theme_bw() +
theme(legend.position = "none") +
geom_vline(xintercept = resultado$mejor_individuo, color="red")
funcion03 <- function(x, y){
return((x^2+y^2)^0.25*(sin(50*(x^2+y^2)^0.1)^2+1))
}
xMin <- -100
xMax <- 100
resultado <- algoritmoGenetico(cantidadIndividuos = 5, cantidadVariables=2, limiteInf = c(xMin, xMin), limiteSup = c(xMax, xMax), generacionesSinCambio = 40, fitnessFn = function(x,y) {-funcion03(x,y)})
## mejor individuo proceso: 0.747412401510967, 0.747412401510967
x <- y <- seq(xMin, xMax, length.out = 255)
z <- outer(x, y, funcion03)
nbcol = 100
color = rev(rainbow(nbcol, start = 0/6, end = 4/6))
zcol = cut(z, nbcol)
p <- plot_ly(x = x, y = y, z = z) %>% add_surface(
contours = list(
z = list(
show=TRUE,
usecolormap=TRUE,
highlightcolor="#ff0000",
project=list(z=TRUE)
)
)
) %>%
layout(
scene = list(
camera=list(
eye = list(x=1.87, y=0.88, z=-0.64)
)
)
)
p
resultado$mejor_individuo
## [1] 0.7474124 0.7474124
¿Corresponde al mínimo global el valor encontrado? Repita la búsqueda varias veces y determine el valor medio y desvío.
¿Se encuentra ahora el mínimo global dentro del intervalo?
En el archivo desconocido1.csv se ha registrado información de un proceso que puede describirse mediante la ecuación: \[y1 = a_1x^3_1 + a_2 x^2_1 + a_3 x_1 + a_4\] Se sabe que las mediciones contienen ruido, y que los parámetro del sistema se encuentran acotados en el intervalo [−5,1.5]. Utilice un algoritmo genético para determinar los parámetros delmodelo. Calcule el error cuadrático total obtenido de la comparción entre los datos provistos y la función aproximada mediante el algoritmo. ¿Qué puede concluir del ajuste?
desconocido1 <- read_csv("../../PUBLICO/Encuentro 5/Práctica/desconocido1.csv", col_names = FALSE)
errorEj2 <- function(a1, a2, a3, a4){
x <- desconocido1[, 1] %>% as.matrix(ncol=1) %>% t()
y <- matrix(rep(desconocido1[, 2], length(a1)) %>% unlist(), ncol=length(x))
# habrá 128 salidas por individuo (una por cada dato del dataset)
# hay tantos individuos como se configure en el algoritmo (100 en este caso)
salidaEstimada <- a1 %*% x^3 + a2 %*% x^2 + a3 %*% x + a4
# la matriz de error es de 100x128
error <- y-salidaEstimada
# los renglones representan a los individuos evaluados
error_cuadratico_medio = rowMeans(error^2)
return(error_cuadratico_medio)
}
# Rango de los parametros
xMin <- -5
xMax <- 1.5
resultado <- algoritmoGenetico(limiteInf = rep(xMin,4), limiteSup = rep(xMax,4), cantidadVariables = 4, fitnessFn = function(a1, a2, a3, a4) {-errorEj2(a1, a2, a3, a4)})
## mejor individuo proceso: 0.145790377515368, -0.365768822142854, -0.495343051617965, -2.96343403856736